package interview.ant;

import org.springframework.scheduling.annotation.Scheduled;

import java.util.HashMap;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

/**
   0元抢购礼品活动，每天凌晨0点整，放出1000件礼品。
 每个用户每天最多只能买到3件（超过3件则交易失败）。
 代码工作环境为单机高并发
 实现一个类，模拟用户抢购的功能
 */
public class AntsOfBuyShop {
    /**
     * 库存
     */
    AtomicInteger stock = new AtomicInteger(1000);
    /**
     * 用户购买记录
     */
    HashMap<Integer, Integer> map = new HashMap<>();
    /**
     * 锁
     */
    ReentrantLock lock = new ReentrantLock();
    /**
     * 队列
     */
    ConcurrentLinkedDeque<Integer> queue = new ConcurrentLinkedDeque();

    public void buy(int userId) {
        boolean b = lock.tryLock();
        if (!b) {
            queue.add(userId);
        }
        try {
            syncBuy(userId);
        } finally {
            lock.unlock();
        }
    }

    @Scheduled(cron = "0/5 * * * * ?")
    public void task() {
        if (queue.isEmpty()) {
            return;
        }
        Integer userId = queue.getFirst();
        queue.removeFirst();
        syncBuy(userId);
    }

    public void syncBuy(int userId) {
        if (map.containsKey(userId)) {
            Integer count = map.get(userId);
            if (count == 3) {
                return;
            }
            stock.getAndDecrement();
            map.put(userId, ++count);
            return;
        }
        stock.getAndDecrement();
        map.put(userId, 1);
    }
}
